// C Source File
// Created 11/19/2007; 7:44:11 PM

#include "Map.h"
#include "Civilization.h"
#include "Terrain.h"
#include "Game.h"

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawStartPage //////////////////////////////////////////////////////////////////////////////////////////////////
// the start screen, shows version ////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawStartPage()
{
	// clear the screen
	ClrScr();

	// prints the title and version number
	DrawStr(25, 30, "Civilization 2000", A_NORMAL);
	DrawStr(65, 40, version, A_NORMAL);
}
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Clr ////////////////////////////////////////////////////////////////////////////////////////////////////////////	 																
// clears an area on the screen ///////////////////////////////////////////////////////////////////////////////////	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////		
void Clr(int x1, int y1, int x2, int y2)
{
	char i;
	for(i = y1; i < y2+1; i++)
		DrawLine(x1, i, x2, i, A_REVERSE);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawMap ////////////////////////////////////////////////////////////////////////////////////////////////////////
// function to draw the map ///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawMap()
{		
	  // clear the screen
		ClrScr();
		
		// makes a grid
		int loopA, loopB;
		for (loopA = 0; loopA < 111; loopA+=10)
		for (loopB = 0; loopB < 71; loopB+=10) 
		{		
			// Draw the line for the grid
			DrawLine(0, 29+loopB, 110, 29+loopB, A_NORMAL);
			DrawLine(loopA, 29, loopA, 99, A_NORMAL);
		}
		
		for (loopA = 0; loopA < 11; loopA++)
		for (loopB = 0; loopB < 7; loopB++) 
		{
			// Draw the background sprite
			if(GetBit(civilization[0].fog, (5*game.qX+loopA) + (3*game.qY+loopB) * game.mapWidth))
				Sprite16(10*loopA+1, 10*loopB+30, SPRITE_HEIGHT, &game.backpic[(Worldmap(3*game.qY+loopB,5*game.qX+loopA)-1)*SPRITE_HEIGHT], LCD_MEM, SPRT_OR);
			else
				Sprite16(10*loopA+1, 10*loopB+30, SPRITE_HEIGHT, black, LCD_MEM, SPRT_OR);
		}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawMapSquare //////////////////////////////////////////////////////////////////////////////////////////////////
// function to draw the map ///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawMapSquare2(char civ, int i, int j, int x, int y)
{		
  int x0 = i-3+x;
  int y0 = j-3+y;
  
	// Draw the background sprite
  if((x0 < 0 || x0 > game.mapWidth) ||
     (y0 < 0 || y0 > game.mapHeight)||
     !GetBit(civilization[civ].fog, x0 + y0 * game.mapWidth))
		Sprite16(91 + i*10, 6 + j*10, SPRITE_HEIGHT, black, LCD_MEM, SPRT_OR);
  else	
		Sprite16(91 + i*10, 6 + j*10, SPRITE_HEIGHT, &game.backpic[(Worldmap(y0,x0)-1)*SPRITE_HEIGHT], LCD_MEM, SPRT_OR);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawMiniMap ////////////////////////////////////////////////////////////////////////////////////////////////////
// draws the entire map, showing current position /////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawMiniMap() 
{
	// clear the screen
	ClrScr();
	//TopMenu();
	
	int loopA, loopB, count;
	for (loopA = 0; loopA < 91; loopA++)
	for (loopB = 0; loopB < 43; loopB++)
		if (Worldmap(loopB,loopA) < 2 || !GetBit(civilization[0].fog, loopA + loopB * game.mapWidth))
			DrawPix(31 + loopA, 27 + loopB, A_NORMAL);
			
	DrawPix(30 + GetCursorX(), 26 + GetCursorY(), A_XOR);
	
	while (!kbhit()) {
		for (count = 1; count < 1500; count++) kbhit();
		DrawPix(30 + GetCursorX(), 26 + GetCursorY(), A_XOR);
	}
	
	GKeyFlush();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawCity ///////////////////////////////////////////////////////////////////////////////////////////////////////
// draws any cities present ///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawCity() 
{	
	int i, j;
	
	for(j = 0; j < civilization[0].citySize; j++)
	{		
		if ((civilization[0].city[j].x - 5*game.qX) > 0 && (civilization[0].city[j].x - 5*game.qX) < 12 &&
				(civilization[0].city[j].y - 3*game.qY) > 0 && (civilization[0].city[j].y - 3*game.qY) < 8) 
		{
			ClrGrid(civilization[0].city[j].x, civilization[0].city[j].y);
			Sprite16(10*(civilization[0].city[j].x - 5*game.qX -1)+1, 10*(civilization[0].city[j].y - 3*game.qY -1)+30, SPRITE_HEIGHT, citypic, LCD_MEM, SPRT_OR);
		}
	}
	
	for(i = 1; i < civNumb; i++)
	for(j = 0; j < civilization[i].citySize; j++)
	{		
		if ((civilization[i].city[j].x - 5*game.qX) > 0 && (civilization[i].city[j].x - 5*game.qX) < 12 &&
				(civilization[i].city[j].y - 3*game.qY) > 0 && (civilization[i].city[j].y - 3*game.qY) < 8) 
		{
			if(GetBit(civilization[0].fog, civilization[i].city[j].x-1 + (civilization[i].city[j].y-1)*game.mapWidth))
			{
				ClrGrid(civilization[i].city[j].x, civilization[i].city[j].y);
				Sprite16(10*(civilization[i].city[j].x - 5*game.qX -1)+1, 10*(civilization[i].city[j].y - 3*game.qY -1)+30, SPRITE_HEIGHT, citypic, LCD_MEM, SPRT_OR);
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawUnit ///////////////////////////////////////////////////////////////////////////////////////////////////////
// draws any units present ////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawUnit() 
{	
	int i = 0, j;
	
	for(j = 0; j < civilization[0].unitSize; j++)
	{		
		if ((civilization[0].unit[j].x - 5*game.qX) > 0 && (civilization[0].unit[j].x - 5*game.qX) < 12 &&
				(civilization[0].unit[j].y - 3*game.qY) > 0 && (civilization[0].unit[j].y - 3*game.qY) < 8) 
		{
			ClrGrid(civilization[0].unit[j].x, civilization[i].unit[j].y);
			Sprite16(10*(civilization[0].unit[j].x - 5*game.qX -1)+1, 10*(civilization[0].unit[j].y - 3*game.qY -1)+30, SPRITE_HEIGHT, &game.unitpic[_units[civilization[0].unit[j].type].pic*SPRITE_HEIGHT], LCD_MEM, SPRT_OR);
		}
	}
	
	for(i = 1; i < civNumb; i++)
	for(j = 0; j < civilization[i].unitSize; j++)
	{		
		if ((civilization[i].unit[j].x - 5*game.qX) > 0 && (civilization[i].unit[j].x - 5*game.qX) < 12 &&
				(civilization[i].unit[j].y - 3*game.qY) > 0 && (civilization[i].unit[j].y - 3*game.qY) < 8) 
		{
			if(GetBit(civilization[0].fog, civilization[i].unit[j].x-1 + (civilization[i].unit[j].y-1)*game.mapWidth))
			{
				ClrGrid(civilization[i].unit[j].x, civilization[i].unit[j].y);
				Sprite16(10*(civilization[i].unit[j].x - 5*game.qX -1)+1, 10*(civilization[i].unit[j].y - 3*game.qY -1)+30, SPRITE_HEIGHT, &game.unitpic[_units[civilization[i].unit[j].type].pic*SPRITE_HEIGHT], LCD_MEM, SPRT_OR);
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawCursor /////////////////////////////////////////////////////////////////////////////////////////////////////
// draws the cursor so select units and buildings, and to move the screen /////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define DrawCursor()  Sprite16(10*(game.cursor[0] -1), 10*(game.cursor[1] -1)+29, CURSOR_HEIGHT, cursorpic, LCD_MEM, SPRT_XOR);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DrawScreen //////////////////////////////////////////////////////////////////////////////////////////////////
// uses previous methods to draw the graphics to the screen ///////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DrawScreen() 
{	
	DrawMap();
	DrawUnit();
	DrawCity();
	TopMenu();
	CursorMenu();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MoveCursor /////////////////////////////////////////////////////////////////////////////////////////////////////
// moves the cursor and return 1 if enter was presses, 0 for esc //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MoveUnitCursor(char unit)
{
	int key = 0, count;
	bool new_screen = 0;
	
	// for distance calculations
	bool updateDist = 1;
	char dis[5];
	int dist = -1;
	
	int xI = GetCursorX() - 1, yI = GetCursorY() - 1;
	int xF[30], yF[30];
	
	ClrSide();
	DrawStr(112, 33, "Moves: ", A_NORMAL);
	
	while (key != KEY_ENTER && key != KEY_ESC) 
	{
    key = 0;
		GKeyFlush();
    
		if(updateDist)
		{
			dist = getPath(xI, yI, GetCursorX() - 1, GetCursorY() - 1, xF, yF, 0);
			if(dist == -1)
				strcpy(dis, " -");
			else
				sprintf(dis, "%d", dist);
			
			updateDist = 0;
		}
		
	  if(new_screen) 
	  {
	  	DrawScreen();
	  	new_screen = 0;	  	
	  }
		
		// display cursor and stuff
		if(dist != -1)
		{
			for(count = 0; count < dist+1; count++)
			{
				int x = xF[count] - 5*game.qX, y = yF[count] - 3*game.qY;
				if(x >= 0 && x < 11 && y >= 0 && y < 7)
					Sprite16(10*x, 10*y+29, CURSOR_HEIGHT, cursorpic, LCD_MEM, SPRT_XOR);
			}
		}
		else DrawCursor();
		DrawStr(115, 43, dis, A_XOR);
		
		// pause for key press
		for (count = 1; count < 1000 && key == 0; count++) key = kbhit();
		
		// clear cursor and stuff
		if(dist != -1)
		{
			for(count = 0; count < dist+1; count++)
			{
				int x = xF[count] - 5*game.qX, y = yF[count] - 3*game.qY;
				if(x >= 0 && x < 11 && y >= 0 && y < 7)
					Sprite16(10*x, 10*y+29, CURSOR_HEIGHT, cursorpic, LCD_MEM, SPRT_XOR);
			}
		}
		else DrawCursor();
		DrawStr(115, 43, dis, A_XOR);
		
		// pause for key press
		for (count = 1; count < 1000 && key == 0; count++) key = kbhit();
		
		if (key == KEY_LEFT) //left
		{
			updateDist = 1;
      if (--game.cursor[0] < 1)
      	if (game.qX > 0) { game.qX--;game.cursor[0] = 6;new_screen = 1;}
      	else game.cursor[0] = 1;
    }
    else if (key == _2ND_LEFT) //2nd + left
    {
			updateDist = 1;
      if (game.qX > 0) { game.qX--;new_screen = 1; }
      else game.cursor[0] = 1;
    }
    else if (key == KEY_RIGHT) //right
    {
			updateDist = 1;
      if (++game.cursor[0] > 11)
      	if (game.qX < game.qXMax) { game.qX++;game.cursor[0] = 6;new_screen = 1; }
      	else game.cursor[0] = 11;
    }
    else if (key == _2ND_RIGHT) //2nd + right
    {
			updateDist = 1;
    	if (game.qX < game.qXMax) { game.qX++;new_screen = 1; }
      else game.cursor[0] = 11;
    }
    else if (key == KEY_UP) //up
    {
			updateDist = 1;
      if (--game.cursor[1] < 1)
      	if (game.qY > 0) { game.qY--;game.cursor[1] = 4;new_screen = 1; }
      	else game.cursor[1] = 1;
    }
    else if (key == _2ND_UP) //2nd + up
    {
			updateDist = 1;
      if (game.qY > 0) { game.qY--;new_screen = 1; }
      else game.cursor[1] = 1;
    }
    else if (key == KEY_DOWN) //down
    {
			updateDist = 1;
      if (++game.cursor[1] > 7)
      	if (game.qY < game.qYMax) { game.qY++;game.cursor[1] = 4;new_screen = 1; }
      	else game.cursor[1] = 7;
    }
    else if (key == _2ND_DOWN) //2nd + down
    {
			updateDist = 1;
      if (game.qY < game.qYMax) { game.qY++;new_screen = 1; }
      else game.cursor[1] = 7;
    }
    else
    {
    	
    }
	}
	
	if(key != KEY_ENTER)  return 0;
	
	if(dist > 0)
	{
		civilization[0].unit[unit].xTarget = xF[0];
		civilization[0].unit[unit].yTarget = yF[0];
		MoveUnit(0, unit, xF, yF, dist);
	}
	
	return 1;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MoveMainCursor /////////////////////////////////////////////////////////////////////////////////////////////////
// moves the cursor and handles the keys for main loop ////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool MoveMainCursor()
{
	bool new_screen = 1;
	int loop, key = 0;
	char keyStr[15];
	char cityI = 0, unitI = 0;
	
	while (key != KEY_ESC && key != KEY_HOME) 
	{		
		//reset the key var
		key = 0;
		
		//draws the screen if new_screen == (true)
		if (new_screen) DrawScreen();
		new_screen = 0;
		UpdateCursorMenu();
		Preview();
		
		while(key == 0)
		{
			DrawCursor();
			for (loop = 1; loop < 1000 && key == 0; loop++) key = kbhit();
			DrawCursor();
			for (loop = 1; loop < 1000 && key == 0; loop++) key = kbhit();
		}
		GKeyFlush();
		
		switch (key)
		{    
	    case KEY_LEFT: //left
	      if (--game.cursor[0] < 1)
	      	if (game.qX > 0) { game.qX--;game.cursor[0] = 6;new_screen = 1;}
	      	else game.cursor[0] = 1;
	      break;
	      
	    case _2ND_LEFT: //2nd + left
	      if (game.qX > 0) { game.qX--;new_screen = 1; }
	      else game.cursor[0] = 1;
	      break;
	      
	    case KEY_RIGHT: //right
	      if (++game.cursor[0] > 11)
	      	if (game.qX < game.qXMax) { game.qX++;game.cursor[0] = 6;new_screen = 1; }
	      	else game.cursor[0] = 11;
	      break;
	      
	    case _2ND_RIGHT: //2nd + right
	      if (game.qX < game.qXMax) { game.qX++;new_screen = 1; }
	      else game.cursor[0] = 11;
	      break;  
	      
	    case KEY_UP: //up
	      if (--game.cursor[1] < 1)
	      	if (game.qY > 0) { game.qY--;game.cursor[1] = 4;new_screen = 1; }
	      	else game.cursor[1] = 1;
	      break;
	    
	    case _2ND_UP: //2nd + up
	      if (game.qY > 0) { game.qY--;new_screen = 1; }
	      else game.cursor[1] = 1;
	      break;
	      
	    case KEY_DOWN: //down
	      if (++game.cursor[1] > 7)
	      	if (game.qY < game.qYMax) { game.qY++;game.cursor[1] = 4;new_screen = 1; }
	      	else game.cursor[1] = 7;
	      break;
	    
	    case _2ND_DOWN: //2nd + down
	      if (game.qY < game.qYMax) { game.qY++;new_screen = 1; }
	      else game.cursor[1] = 7;
	      break;
	      
	    case SHIFT_LEFT:
	    	if(civilization[0].citySize > 0)
	    	{
		    	if(--cityI < 0 || cityI >= civilization[0].citySize) cityI = civilization[0].citySize - 1;
		    	SetCursor(civilization[0].city[cityI].x, civilization[0].city[cityI].y);
		    	new_screen = 1;
	    	}
	    	break;
	      
	    case SHIFT_RIGHT:
	    	if(civilization[0].citySize > 0)
	    	{
		    	if(++cityI >= civilization[0].citySize) cityI = 0;
		    	SetCursor(civilization[0].city[cityI].x, civilization[0].city[cityI].y);
		    	new_screen = 1;
	    	}
	    	break;
	      
	    case DIAMOND_LEFT:
	    	if(civilization[0].unitSize > 0)
	    	{
		    	if(--unitI < 0 || unitI >= civilization[0].unitSize) unitI = civilization[0].unitSize - 1;
		    	SetCursor(civilization[0].unit[unitI].x, civilization[0].unit[unitI].y);
		    	new_screen = 1;
	    	}
	    	break;
	      
	    case DIAMOND_RIGHT:
	    	if(civilization[0].unitSize > 0)
	    	{
		    	if(++unitI >= civilization[0].unitSize) unitI = 0;
		    	SetCursor(civilization[0].unit[unitI].x, civilization[0].unit[unitI].y);
		    	new_screen = 1;
	    	}
	    	break;
	      
	    case KEY_F1:
	    	AdvisorMenu();
  			new_screen = 1;
	    	break;
	      
	    case KEY_F3:
  			new_screen = DisplayCursorStats();
	    	break;
	      
	    //case KEY_F4:
	    //  ViewUnit();
	    //  new_screen = 1;
  		//	kbhit();
	    //  break;
	      
	    case KEY_F5:
	      DrawMiniMap();
  			new_screen = 1;
  			kbhit();
	      break;
	      
	    /*#ifdef DEBUG
	    case KEY_F6:
	    	TestChar();
	    	new_screen = 1;
	    	break;
	    #endif*/
	      
	    case KEY_ENTER:
	      if(Select()) new_screen = 1;
	      break;
	      
	    /*default:
	    	sprintf(keyStr, "key: %d", key);
	    	DebugStr(keyStr);
	    	new_screen = 1;
	    	break;*/
  	}
  
	}
	
	if(key == KEY_ESC) return 0;
	return 1;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SetCursor //////////////////////////////////////////////////////////////////////////////////////////////////////
// sets the cursor and other variables so that the screen in on the cursor ////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SetCursor(int x, int y)
{
	game.qX = max(0, x / 5 - 1);
	game.qY = max(0, y / 3 - 1);
	
	game.cursor[0] = x - game.qX*5;
	game.cursor[1] = y - game.qY*3;
}

